import store from "../../../store";
import request from './request.js';
/************公共工具方法************/
let globalObj = {
	//生成随机数
	uuid() {
		let len = 8; //长度
		let radix = 8; //基数
		let chars = 'GHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
		let uuid = [],
			i;
		radix = radix || chars.length;
		if (len) {
			for (i = 0; i < len; i++) uuid[i] = chars[0 | (Math.random() * radix)];
		} else {
			let r = null;
			uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
			uuid[14] = '4';
			for (i = 0; i < 36; i++) {
				if (!uuid[i]) {
					r = 0 | (Math.random() * 16);
					uuid[i] = chars[i == 19 ? (r & 0x3) | 0x8 : r];
				}
			}
		}
		return uuid.join('');
	},

	//计算文件的大小
	diskSize: (num) => {
		if (!num) return '0B';
		let k = 1024; //设定基础容量大小
		let sizeStr = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; //容量单位
		let i = 0; //单位下标和次幂
		for (let l = 0; l < 8; l++) { //因为只有8个单位所以循环八次
			if (num / Math.pow(k, l) < 1) { //判断传入数值 除以 基础大小的次幂 是否小于1，这里小于1 就代表已经当前下标的单位已经不合适了所以跳出循环
				break; //小于1跳出循环
			}
			i = l; //不小于1的话这个单位就合适或者还要大于这个单位 接着循环
		}
		//例： 900 / Math.pow(1024, 0)  1024的0 次幂 是1 所以只要输入的不小于1 这个最小单位就成立了；
		//   900 / Math.pow(1024, 1)  1024的1次幂 是1024  900/1024 < 1 所以跳出循环 下边的 i = l；就不会执行  所以 i = 0； sizeStr[0] = 'B';
		//   以此类推 直到循环结束 或 条件成立
		return (num / Math.pow(k, i)).toFixed(2) + sizeStr[i]; //循环结束 或 条件成立 返回字符
	},

	changeTwoDecimal_f(x) {
		var f_x = parseFloat(x);
		if (isNaN(f_x)) {
			return 0;
		}
		var f_x = Math.round(x * 100) / 100;
		var s_x = f_x.toString();
		var pos_decimal = s_x.indexOf('.');
		if (pos_decimal < 0) {
			pos_decimal = s_x.length;
			s_x += '.';
		}
		while (s_x.length <= pos_decimal + 2) {
			s_x += '0';
		}
		return s_x;
	},

	//计算网速
	filterNet: (size) => {
		let filterSize = ''
		if (size < 1024) {
			filterSize = size.toFixed(2) + 'B';
		} else if (size / 1024 >= 1 && size / 1024 / 1024 < 1) {
			filterSize = (Math.floor(size / 1024 * 100) / 100).toFixed(2) + 'KB';
		} else if (size / 1024 / 1024 >= 1) {
			filterSize = (Math.floor(size / 1024 / 1024 * 100) / 100).toFixed(2) + 'M';
		}
		return filterSize + '/s'
	}
}
/************重要的接口************/
// 获取下载时候需要的token
async function getToken(task) {
	const params = {
		method: 'POST',
		url: '/nas/user/upload/userInfo',
		contentType: 'application/x-www-form-urlencoded',
		data: {
			pathFileName: task.fileInfo.filenamepath,
			uploadType: 1
		}
	};
	console.log(params, '获取token的请求头')
	const res = await request(params);
	console.log(res, '返回的token')
	task.token = res.data
	task.startDownload()
}

/************文件上传处理类************/
let nasDownloadClass = class {
	constructor(options) {
		this.fileInfo = {
			...options
		}
		this.uid = options.uid //唯一的标识
		this.partSize = '0B' //已经下载的大小
		this.totalSize = globalObj.diskSize(this.fileInfo.size) //文件的总大小（含单位）
		this.taskStatus = 'pending'; //任务状态 等待、开始、暂停、失败 默认为等待pending
		this.downloadTask = null //下载任务
		this.speed = 0 // 下载的进度
	}

	/************开始下载前************/
	beforeDownload() {
		this.taskStatus = 'start';
		// 先获取下载的token再进行下载
		getToken(this)
	}
	/************开始下载************/
	startDownload() {
		const path = 'http://58.34.36.138:18480/nasforward/file/download?filenamepath=' + this.fileInfo
			.filenamepath + '&offset=0&bufsize=&fileName=' + this.fileInfo.name + '&uploadToken=' + this.token +
			'&clientType=2'
		let params = {}
		// ios只能保存到系统相册，安卓可以指定目录
		if (plus.os.name == "Android") {
			params.filename = 'file://storage/emulated/0/YunNas/' + this.fileInfo.name //利用保存路径，实现下载文件的重命名
		}
		//注意：url是你要下载的文件路径，  xlsName（变量，随便命名） 是文件的后缀名，用于文件命名和格式修改
		//1.本地路径开头使用file://;
		//2.Android平台本地绝对路径为"storage/emulated/0",就是用户文件管理器能看到的了;
		//3.创建"YunNas"作为文件夹名称，后缀是用于文件命名和格式修改。
		let _this = this
		this.downloadTask = plus.downloader.createDownload(path, params,
			function(d, status) { //d为下载的文件对象;status下载状态
				if (status == 200) {
					store.commit('nasDownloadListDelete', _this);
					//下载成功
					// console.log("下载成功", d)
					if (plus.os.name == "Android") {
						// console.log("下载成功", d)
					} else {
						// IOS需要保存文件的操作
						let fileSaveUrl = plus.io.convertLocalFileSystemURL(d.filename);
						// console.log(fileSaveUrl, 'fileSaveUrl')
						uni.saveImageToPhotosAlbum({
							filePath: fileSaveUrl,
							success: function(red) {}
						});
					}
					//d.filename是文件在保存在本地的相对路径，使用下面的API可转为平台绝对路径
					// let fileSaveUrl = plus.io.convertLocalFileSystemURL(d.filename);
					// plus.runtime.openFile(d.filename); //选择软件打开文件
				} else { //下载失败
					console.log("下载失败")
					plus.downloader.clear(); //清除下载任务
				}
			});
		//监听下载的进度
		this.downloadTask.addEventListener('statechanged', task => {
			switch (task.state) {
				case 1:
					console.log('开始下载');
					break;
				case 2:
					console.log('链接到服务器...');
					break;
				case 3:
					if (this.downloadTask) {
						if(task.downloadedSize <= this.fileInfo.size) {
							this.partSize = globalObj.diskSize(task.downloadedSize)
							this.speed = Math.floor(globalObj.changeTwoDecimal_f(task.downloadedSize / task
								.totalSize) * 100);
								// console.log(this.speed, 'this.speed')
						} else {
							this.partSize = this.totalSize;
							this.speed = 100;
						}
					}
					// if (cb1) cb1(progressVal);
					break;
				case 4:
					// 下载完成
					break;
			}
		});
		//启动下载
		this.downloadTask.start()
	}

	/************取消下载************/
	cancelDownload() {
		this.downloadTask.abort()
		// 删除对应的下载任务
		store.commit('nasDownloadListDelete', this);
	}
	/************暂停下载************/
	pauseDownload() {
		this.taskStatus = 'pause';
		this.downloadTask.pause()
	}
	/************继续下载************/
	goTo(name) {
		this.taskStatus = 'start';
		this.downloadTask.abort()
		this.startDownload()
	}
}
export default {
	nasDownloadClass
}
